package com.koron.common.core.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Slf4j
public class FastJsonUtils {


    /**
     * 功能描述：把JSON数据转换成指定的java对象
     *
     * @param jsonData JSON数据
     * @param clazz    指定的java对象
     * @return 指定的java对象
     */
    public static <T> T getJsonToBean(String jsonData, Class<T> clazz) {
        return JSON.parseObject(jsonData, clazz);
    }

    /**
     * 功能描述：把java对象转换成JSON数据
     *
     * @param object java对象
     * @return JSON数据
     */
    public static String getBeanToJson(Object object) {
        return JSON.toJSONString(object);
    }

    /**
     * 功能描述：把JSON数据转换成指定的java对象列表
     *
     * @param jsonData JSON数据
     * @param clazz    指定的java对象
     * @return List<T>
     */
    public static <T> List<T> getJsonToList(String jsonData, Class<T> clazz) {
        return JSON.parseArray(jsonData, clazz);
    }

    /**
     * 功能描述：把JSON数据转换成较为复杂的List<Map<String, Object>>
     *
     * @param jsonData JSON数据
     * @return List<Map < String, Object>>
     */
    public static List<Map<String, Object>> getJsonToListMap(String jsonData) {
        return JSON.parseObject(jsonData, new TypeReference<List<Map<String, Object>>>() {
        });
    }

    /**
     * 泛型集合 转 hashmap集合
     * @param reportDataList
     * @return
     */
    public static ArrayList<HashMap<String, String>> convertToDataList(List<?> reportDataList) {
        String json = "";
        try {
            json = new ObjectMapper().writeValueAsString(reportDataList);
        } catch (JsonProcessingException e) {
            log.error(e.getMessage(), e);
        }
        log.info(json);
        TypeToken<ArrayList<HashMap<String, String>>> type = new TypeToken<ArrayList<HashMap<String, String>>>() {
        };
        ArrayList<HashMap<String, String>> dataList = new Gson().fromJson(json, type.getType());
        return dataList;
    }

    /**
     * TODO 将任意对象转为json字符串, 并忽略值为null的属性
     */
    public static String toJSONStringNoNull(Object object) {
        return JSON.toJSONString(object, SerializerFeature.PrettyFormat);
    }

}
